<?php

class Usuarios_Model_Usuarios extends Model_Cna {
	
	/**
	 * Asigna el rol como favorito para el usuario
	 * @param int $codusuario
	 * @param int $codrol
	 */
	public function asignarRolFavorito($codusuario, $codrol) {
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		$usuariosTable->asignarRolFavorito($codusuario, $codrol);
	}
	
	/**
	 * Devuelve el adaptador para el paginador del listado de usuarios
	 * @return Zend_Paginator_Adapter_DbSelect
	 */
	public function getPaginatorAdapterFetchAll($codsede="",$buscar="") {
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		//return $usuariosTable->fetchAll();
		return $usuariosTable->getSelectFetchAll($codsede,$buscar);
		
		//$adapter = new Zend_Paginator_Adapter_DbTableSelect($dbselect);
		//return $adapter;
	}
	
	
	/**
	 * Devuelve el adaptador para el paginador del listado de usuarios
	 * @return Zend_Paginator_Adapter_DbSelect
	 */
	public function traerRolesUsuarios($datos) {
	    $roles = new Roles_Model_Roles();
	   foreach ($datos as $key => $value){
	        $datos[$key]["roles"] =$roles->getRolesPorUsuario($value["codusuario"]);
	    }
	    return $datos;
	}
	
	/**
	 * Almacena los datos del usuario en la base de datos
	 * @param array $datos Los datos del usuario
	 */
	public function guardarUsuario($datos) {
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		$condicion="";
		if(isset($datos["codusuario"]) && !empty($datos["codusuario"])) {
    		$condicion = " AND codusuario <> {$datos["codusuario"]}";
		}
		if(isset($datos["cedula"])){
			$row = $usuariosTable->fetchRow("cedula={$datos["cedula"]}{$condicion}");
			if(!is_null($row)) {
				throw new Exception("El número de identificación '{$datos["cedula"]}' ya existe. Por favor verifique la información.");
				return $row;
			}
		}
		if(isset($datos["codusuario"]) && !empty($datos["codusuario"])) {
			$row = $usuariosTable->find($datos["codusuario"])->current();
			return $row->setFromArray($datos)->save();
		} else {
			unset($datos["codusuario"]);
			$key = $usuariosTable->createRow($datos)->save();
			$this->generarNombreUsuario($key);
			return $key;
		}
	}
	
	/**
	 * Carga los datos de un usuario
	 * @param $codusuario Código del usuario
	 * @return Array con los datos del usuario
	 */
	public function cargardatos($codusuario){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		return $usuariosTable->find($codusuario)->current()->toArray();
	}
	
	/**
	 * Eliminar usuario
	 * @param $cod_usuario Código del usuario
	 * @return Retorna booleam
	 */
	public function eliminar($codusuario){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		return $usuariosTable->find($codusuario)->current()->delete();
//		return $usuariosTable->delete("codusuario=".$codusuario);
	}
	
	/**
	 * Devuelve un arreglo del listado de usuarios por rol
	 * usado en el componente de roles
	 * @return array
	 */
	public function getArregloUsuariosRol($codrol) {
		$UsuariosTable = new Usuarios_Model_DbTable_Usuarios();
		return $UsuariosTable->getSelectUsuariosRolFetchAll($codrol);
	}
	
	public function getArrayCountUsuariosRolAsignados(){
		$RolesusuariosTable = new Usuarios_Model_DbTable_Rolesusuarios();
		return $RolesusuariosTable->getArrayCountUsuariosPorRol();
	}
	
	/**
	 * Devuelve un arreglo con el listado de inactivaciones del usuario
	 * @return array
	 */
	public function getInactivaciones($codusuario) {
		$UsuariosTable = new Usuarios_Model_DbTable_Inactivacionescna();
		return $UsuariosTable->getSelectInactivacionesFetchAll($codusuario);
	}
	/**
	 * Registra el cambio de estado de un usuario
	 * @param array $datos Los datos para el cambio de estado
	 */
	public function cambiarestado($datos) {
		$usuariosTable = new Usuarios_Model_DbTable_Inactivacionescna();
		return $usuariosTable->createRow($datos)->save();
	}
	
	public function asignarRoles($codusuario,$arregloRoles){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		$usuariosTable->getAdapter()->beginTransaction();
		try {
			//DELETE FROM rolesusuarios WHERE codusuario=?
			$usuariosTable->getAdapter()->delete("rolesusuarios","codusuario={$codusuario}");
			$datos=array();
			$datos["codusuario"]=$codusuario;
			$datos["favorito"]="N";
			for($i=0;$i<count($arregloRoles);$i++){
				$datos["codrol"]=$arregloRoles[$i];
				$usuariosTable->getAdapter()->insert("rolesusuarios",$datos);
			}
			$usuariosTable->getAdapter()->commit();
		} catch (Exception $e) {
			$usuariosTable->getAdapter()->rollBack();
			throw $e;
		}
	}

	/**
	 * Devuelve un arreglo con el listado de usuarios sin asignar
	 * @param integer $codsede Código de la sede
	 * @return array
	 */
	public function getUsuarios($criterio,$datos) {
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		return $usuariosTable->getSelectUsuarios($criterio,$datos);
	}
	
	/**
	 * Devuelve un arreglo con el listado de usuarios para asignar a una SEDE
	 * @param $dato Campo para la consulta
	 * @return array
	 */
	public function cargardatosauto($criterio,$dato,$datos=array()){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		return $usuariosTable->fetchAuto($criterio,$dato,$datos);
	}
	
	/**
	 * Registra un usuario asignado a una SEDE
	 * @param $dato datos para el registro
	 */
	public function asignarUsuarioSEDE($datos){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		$usuariosTable->getAdapter()->delete("usuariossede", "codsede={$datos["codsede"]} and codusuario={$datos["codusuario"]}");
		$usuariosTable->getAdapter()->insert("usuariossede", $datos);
	}

	/**
	 * Registra un usuario asignado a un PLAN DE MEJORAMIENTO
	 * @param $dato datos para el registro
	 */
	public function asignarUsuarioPLAN($datos){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		$usuariosTable->getAdapter()->delete("usuariosplan", "codplanmejoramiento={$datos["codplanmejoramiento"]} and codusuario={$datos["codusuario"]}");
		$usuariosTable->getAdapter()->insert("usuariosplan", $datos);
	}

	/**
	 * Registra un usuario asignado a una DIMENSION
	 * @param $dato datos para el registro
	 */
	public function asignarUsuarioDIMENSION($datos){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		$usuariosTable->getAdapter()->delete("usuariosdimension", "coddimension={$datos["coddimension"]} and codusuario={$datos["codusuario"]}");
		$usuariosTable->getAdapter()->insert("usuariosdimension", $datos);
	}

	/**
	 * Registra un usuario asignado a un INDICADOR
	 * @param $dato datos para el registro
	 */
	public function asignarUsuarioINDICADOR($datos){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		$usuariosTable->getAdapter()->delete("usuariosindicador", "codindicador={$datos["codindicador"]} and codusuario={$datos["codusuario"]}");
		$usuariosTable->getAdapter()->insert("usuariosindicador", $datos);
	}
	
	/**
	 * Devuelve arreglo con los datos de un usuario asignado a una SEDE
	 * @param $dato datos del usuario
	 */
	public function datosUsuarioSEDE($codusuario){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		return $usuariosTable->getAdapter()->fetchRow("SELECT * FROM usuariossede WHERE codusuario={$codusuario}");
		//insert("usuarioinstitucion_cna", $datos);
	}
	
	/**
	 * Elimina la asignación de usuarios a una SEDE
	 * @param array $usuarios los codigos de los usuarios que serán des-asignados
	 */
	public function desasignarUsuarioSEDE($usuarios){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
	    $codusuarios = implode(",",$usuarios);
		return $usuariosTable->getAdapter()->delete("usuariossede","codusuario IN ({$codusuarios})");
	}

	/**
	 * Elimina la asignación de usuarios a un PLAN
	 * @param array $usuarios los codigos de los usuarios que serán des-asignados
	 */
	public function desasignarUsuarioPLAN($codplanmejoramiento,$usuarios){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
	    $codusuarios = implode(",",$usuarios);
		return $usuariosTable->getAdapter()->delete("usuariosplan","codplanmejoramiento={$codplanmejoramiento} AND codusuario IN ({$codusuarios})");
	}

	/**
	 * Elimina la asignación de usuarios a una DIMESNION
	 * @param array $usuarios los codigos de los usuarios que serán des-asignados
	 */
	public function desasignarUsuarioDIMENSION($coddimension,$usuarios){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
	    $codusuarios = implode(",",$usuarios);
		return $usuariosTable->getAdapter()->delete("usuariosdimension","coddimension={$coddimension} AND codusuario IN ({$codusuarios})");
	}

	/**
	 * Elimina la asignación de usuarios a un INDICADOR
	 * @param array $usuarios los codigos de los usuarios que serán des-asignados
	 */
	public function desasignarUsuarioINDICADOR($codindicador,$usuarios){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
	    $codusuarios = implode(",",$usuarios);
		return $usuariosTable->getAdapter()->delete("usuariosindicador","codindicador={$codindicador} AND codusuario IN ({$codusuarios})");
	}

	/**
	 * Genera y actualiza automáticamente el nombre de usuario
	 * @param $codusuario Código del usuario
	 */
	private function generarNombreUsuario($codusuario){
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		$row = $usuariosTable->find($codusuario)->current()->toArray();
		if(is_null($row)) {
			throw new Exception("El usuario {$codusuario} no existe. Método generarNombreUsuario().");
		}
		
		$nombres 	= $row["nombres"];
		$apellidos	= $row["apellidos"];
		
		$letra_nombre 	= App_Util_StringUtil::quitar_acentos(substr($nombres,0,1));
	
		$letra_apellidos = explode(" ",$apellidos);
		$letra_apellidos[0] = App_Util_StringUtil::quitar_acentos($letra_apellidos[0]);

		$nombre_usuario =  strtolower($letra_nombre.$letra_apellidos[0]);
		$r = $usuariosTable->fetchRow("nombreusuario='{$nombre_usuario}' AND codusuario<>{$codusuario}");
		$contador=0;
		while(!is_null($r)) {
			$contador++;
			$nombre_usuario = $nombre_usuario.$contador;
			$r = $usuariosTable->fetchRow("nombreusuario='{$nombre_usuario}' AND codusuario<>{$codusuario}");
		}

		$datos["nombreusuario"]=$nombre_usuario;
		$usuariosTable->update($datos,"codusuario={$codusuario}");
	}
	
    public function guardarPermisosUsuario($codusuario,$arr_asignar){
        $perfilusuarioTable = new Usuarios_Model_DbTable_Perfilusuario();
		$perfilusuarioTable->getAdapter()->beginTransaction();
        try {
			$perfilusuarioTable->delete("codusuario={$codusuario}");
			$datos=array();
			$datos["codusuario"]=$codusuario;
			foreach ($arr_asignar as $key => $value){
			    $datos["codseccion"]=$key;
			    unset($datos["ver"]);unset($datos["crear"]);unset($datos["modificar"]);unset($datos["eliminar"]);
			    foreach($value as $accion){
			        $datos[$accion]="S";
			    }
			    //Zend_Debug::dump($datos);
			    $codperfil = $perfilusuarioTable->createRow($datos)->save();
			}
			$perfilusuarioTable->getAdapter()->commit();
		} catch (Exception $e) {
			$perfilusuarioTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	/**
	 * Devuelve el conjunto de registros de usuarios que pertenecen al/los
	 * roles padre especificados
	 * @param array|int $roles codigos de roles padre
	 * @return array
	 */
	public function getUsuariosPorRolPadre($roles) {
	    $usuariosTable = new Usuarios_Model_DbTable_Usuarios();
	    $rolesService = new Roles_Model_Roles();
	    
	    $usuarios = $usuariosTable->getUsuariosPorRolPadre($roles);
	    for($i=0, $max=count($usuarios); $i<$max; $i++) {
	        $usuarios[$i]["roles"] = $rolesService->getRolesPorUsuario($usuarios[$i]["codusuario"]);
	    }
	    return $usuarios;
	}
	/**
	 * Retorna el listado de Usuarios PAR del sistema
	 * @return Array
	 */
	public function getSelectUsuariosPAR($datos=array(),$count=false){
	    $usuariosTable = new Usuarios_Model_DbTable_Usuarios();
	    return $usuariosTable->getUsuariosPorRolPadre(Roles_Model_Roles::CODPADRE_PAR,$datos,$count);
	}
	
	/**
	 * Enviar correo electrónico al usuario
	 * @param Integer $codusuario Código del usuario
	 * @return Booleam
	 */
	public function notificarPar($codusuario,$clave) {
    	$par = $this->cargardatos($codusuario);
    	
    	$asunto = "Registro SACES-CNA	";
    	 
    	$cuerpo .="usuario: ".$par["nombreusuario"]."\n";
    	$cuerpo .="clave: ".$clave."\n";
    	$cuerpo .="Finalice el registro de la información,ingresando a la pagina http://saces.mineducacion.gov.co/incna/ \n";
    	
    	$mail = new App_Mail();
    	$Observer_Estado = new App_Observer_Estado();
	    $correos = $Observer_Estado->getMailsToSend($par);
	    if(count($correos) >0) {
	        $msg = $Observer_Estado->getTextoSaludo("{$par["nombres"]} {$par["apellidos"]}");
	        $msg .= $cuerpo;
	        $msg .= $Observer_Estado->getTextoDespedida();
	        
	        $mail->sendText($correos, $asunto, $msg);
	    }
	    
	}

	/**
	 * Enviar correo electrónico al usuario
	 * @param Integer $codusuario Código del usuario
	 * @return Booleam
	 */
	public function notificarContrasena($codusuario,$clave) {
    	$par = $this->cargardatos($codusuario);
    	
    	$asunto = "Solicitud contraseña SACES-CNA	";
    	 
    	$cuerpo  ="La solicitud para recuperar su contraseña ha sido atendida: \n";
    	$cuerpo .="usuario: ".$par["nombreusuario"]."\n";
    	$cuerpo .="clave: ".$clave."\n";
    	
    	$mail = new App_Mail();
	    $msg = "Cordial saludo {$par["nombres"]} {$par["apellidos"]} \n";
	    $msg .= $cuerpo;
	    $msg .= "\n\n\n Por favor ingrese al sistema SACES-CNA a través del siguiente link: http://saces.mineducacion.gov.co/incna para obtener mayor detalle de esta información.";
    	$msg .= "\n\n\n Este mensaje ha sido enviado automáticamente por el sistema SACES-CNA del Ministerio de Educación Nacional.";
	    
    	$correo = array("{$par["emailexterno"]}","{$par["emailalterno"]}");
	    $mail->sendText($correo, $asunto, $msg);
	}
	
	/**
	 * Busca el nombre de una entidad bancaria
	 * @param String nombre de la entidad a buscar
	 * @return Array datosde la entidad
	 */
	public function buscarEntidadBancaria($nombre) {
		$usuariosTable = new Usuarios_Model_DbTable_Cuentas();
		return $usuariosTable->buscarEntidadBancaria($nombre);
	}
	
	/**
	 * busca los datos del usuario por campo en la base de datos
	 * @param array $datos Los datos del usuario
	 * @return Array datos del usuario
	 */
	public function buscarUsuario($campo, $valor) {
		$usuariosTable = new Usuarios_Model_DbTable_Usuarios();
		return $usuariosTable->fetchRow("{$campo}={$valor}");
	}
	
	/**
	 *
	 * Registra la asignación de programas a usuarios IES
	 * @param integer $codusuario
	 * @param integer $arr_asignar
	 * @throws Exception
	 */
	
    public function guardarProgramasUsuario($codusuario,$arr_asignar){
        $perfilusuarioTable = new Usuarios_Model_DbTable_Perfilusuario();
		$perfilusuarioTable->getAdapter()->beginTransaction();
        try {
			$datos["codusuario"]=$codusuario;
			foreach ($arr_asignar as $key => $value){
                $datos["codprograma"]=$value;
			    $perfilusuarioTable->getAdapter()->insert("programasusuario", $datos);
			}
			$perfilusuarioTable->getAdapter()->commit();
		} catch (Exception $e) {
			$perfilusuarioTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	/**
	 *
	 * Elimina la asignación de programas a usuarios IES
	 * @param integer $codusuario
	 * @param integer $arr_asignar
	 * @throws Exception
	 */
	
    public function eliminarProgramasUsuario($codusuario,$arr_asignar){
        $perfilusuarioTable = new Usuarios_Model_DbTable_Perfilusuario();
		$perfilusuarioTable->getAdapter()->beginTransaction();
        try {
			$datos["codusuario"]=$codusuario;
			foreach ($arr_asignar as $key => $value){
			    $perfilusuarioTable->getAdapter()->delete("programasusuario", "codusuario={$codusuario} AND codprograma={$value}");
			}
			$perfilusuarioTable->getAdapter()->commit();
		} catch (Exception $e) {
			$perfilusuarioTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
}
